package br.com.sgi.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Controller;

import br.com.sgi.autentication.UsuarioLogado;
import br.com.sgi.enuns.UfEnum;
import br.com.sgi.model.Igreja;
import br.com.sgi.model.Sistema;
import br.com.sgi.model.Users;
import br.com.sgi.model.UsersIgreja;
import br.com.sgi.service.IgrejaService;
import br.com.sgi.service.MembroService;
import br.com.sgi.service.SistemaService;
import br.com.sgi.service.UsersIgrejaService;
import br.com.sgi.service.VisitanteService;
import br.com.sgi.util.Mensagem;

@Controller("igrejaCadastroBean")
@Scope("request")
public class IgrejaCadastroBean extends BaseView{

	@Autowired
	private IgrejaService igrejaService;
	
	@Autowired
	private SistemaService sistemaService;
	
	@Autowired
	private UsersIgrejaService usersIgrejaService;
	
	@Autowired
	private VisitanteService visitanteService;
	
	@Autowired
	private MembroService membroService;
	
	private Igreja igreja;
	private Igreja igrejaPesquisa;
	private Long coIgreja;
	
	private List<Igreja> listaIgrejas;
	
	private List<SelectItem> listaUfs;
	
	/**
	 * pesquisa de igreja
	 */
	public void pesquisarIgreja(){
		listaIgrejas = igrejaService.buscarIgrejasPorFiltros(igrejaPesquisa.getNome(), igrejaPesquisa.getCnpj());
		if(listaIgrejas.isEmpty())
			registroNaoEncontrado = true;
		else
			registroNaoEncontrado = false;
	}
	
	/**
	 * salva Igreja
	 */
	public void salvar(){		
		Users users = UsuarioLogado.getUsuarioLogado();
		if(validarDatas())
			if(igreja != null && users != null){
				Sistema sistema = null;
				if(igreja.getCoSeqIgreja() == null){
					sistema = sistemaService.findById(users.getSistema().getCoSeqSistema())  ;
					igreja.setSistema(sistema);
					igrejaService.salvar(igreja);
					pesquisarIgreja();
					limpar();
					statusBotoesPesquisa();
					Mensagem.infoMsg("sucesso.MGS_02");
				}else{
					igrejaService.atualizar(igreja);
					pesquisarIgreja();
					statusBotoesPesquisa();
					Mensagem.infoMsg("sucesso.MGS_03");
					limpar();
				}
					
			}
	}
	
	/**
	 * realiza a exclusao de uma igreja
	 */
	public void excluir(){
		
			try{
				
				
				if(membroService.existeMembroNaIgreja(igreja.getCoSeqIgreja()))
					Mensagem.addWarn("erro.MSG_05");
				else
					if(visitanteService.existeVisitanteNaIgreja(igreja.getCoSeqIgreja()))
						Mensagem.addWarn("erro.MSG_05");
					else{
							excluirUsersIgreja();
							igrejaService.excluir(igreja.getCoSeqIgreja());
							listaIgrejas = igrejaService.buscarIgrejasPorFiltros(null, null);
							limpar();
							Mensagem.infoMsg("sucesso.MSG_01");
							statusBotoesPesquisa();
						}
			} catch (DataIntegrityViolationException e) {
				Mensagem.addWarn("erro.MSG_05");
				
			}
	}
	
	
	private void excluirUsersIgreja(){
		List<UsersIgreja> listUsersIgreja = usersIgrejaService.buscarUsersIgrejaPorCoIgreja(igreja.getCoSeqIgreja());
		for(UsersIgreja ui: listUsersIgreja){
			usersIgrejaService.excluir(ui.getCoSeqUsersIgreja());
		}
		
		
	}
	
	/**
	 * voltar a tela de pesquisa
	 */
	public void voltar(){
		statusBotoesPesquisa();
	}
	
	/**
	 * Inicia tela para um novo cadastro
	 * @return
	 */
	public void novo(){
		statusBotoesCadastro();
		igreja = new Igreja();
	}
	
	public void editar(){
		statusEditar();
	}
	
	private void limpar(){
		igreja = new Igreja();
	}
	
	private boolean validarDatas(){
		Date dtInauguracao = igreja.getDtInauguracao();
		Date dataCorrente = new Date();
		boolean datasValidas = true;
		if(dataCorrente.compareTo(dtInauguracao) < 0 ){
			Mensagem.addWarn("erro.MSG_07", "Data Inauguração","Data atual");
			datasValidas = false;
		}
			
		return datasValidas;	
	}
	
	public List<Igreja> getListaIgrejas() {
		if(listaIgrejas == null)
			listaIgrejas = new ArrayList<Igreja>();
		return listaIgrejas;
	}

	public void setListaIgrejas(List<Igreja> listaIgrejas) {
		this.listaIgrejas = listaIgrejas;
	}

	public Igreja getIgrejaPesquisa() {
		if(igrejaPesquisa == null)
			igrejaPesquisa = new Igreja();
		return igrejaPesquisa;
	}

	public void setIgrejaPesquisa(Igreja igrejaPesquisa) {
		this.igrejaPesquisa = igrejaPesquisa;
	}
	
	public Igreja getIgreja() {
		if(igreja == null)
			igreja = new Igreja();
		return igreja;
	}

	public void setIgreja(Igreja igreja) {
		this.igreja = igreja;
	}

	public Long getCoIgreja() {
		return coIgreja;
	}

	public void setCoIgreja(Long coIgreja) {
		this.coIgreja = coIgreja;
	}

	public List<SelectItem> getListaUfs() {
		if(listaUfs == null){
			listaUfs = new ArrayList<SelectItem>();
			for(UfEnum uf: UfEnum.values()){
				listaUfs.add(new SelectItem(uf.getSigla(), uf.getSigla()));
			}
		}
		return listaUfs;
	}

	public void setListaUfs(List<SelectItem> listaUfs) {
		this.listaUfs = listaUfs;
	}

	


	
}
